package one.stand.util;

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.*;

/**
 * @author: QIK
 * @CreateDate: 2019/4/15 17:09
 */
public class DateUtil {
    public static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    public static SimpleDateFormat YYYYMMDD = new SimpleDateFormat("yyyy年MM月dd日");
    public static SimpleDateFormat MMDDHHSS = new SimpleDateFormat("MM/dd HH:mm");
    public static SimpleDateFormat HHmmss = new SimpleDateFormat("HH:mm:ss");

    public static String format(SimpleDateFormat dateFormat, Date date) {
        if (Objects.isNull(date)) return null;

        return dateFormat.format(date);
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    public static Date currentDate() {
        return new Date();
    }

    /**
     * 当前日
     *
     * @return
     */
    public static String currentDay() {
        Calendar cal = Calendar.getInstance();
        Integer day = cal.get(Calendar.DATE);
        if (day < 10) {
            return "0" + day;
        }
        return day + "";
    }

    /**
     * 当前月
     *
     * @return
     */
    public static String currentMonth() {
        Calendar cal = Calendar.getInstance();
        Integer month = cal.get(Calendar.MONTH) + 1;
        return monthMap.get(month);
    }

    /**
     * 当前年
     *
     * @return
     */
    public static String currentYear() {
        Calendar cal = Calendar.getInstance();
        return cal.get(Calendar.YEAR) + "";
    }

    public static String getDay() {
        return formatter.format(new Date());
    }

    public static String endDate(String endTime) {
        return endTime + " 23:59:59";
    }

    /**
     * 根据当前时间，添加或减去指定的时间量。例如，要从当前日历时间减去 5 天，可以通过调用以下方法做到这一点：
     * add(Calendar.DAY_OF_MONTH, -5)。
     *
     * @param date 指定时间
     * @param num  为时间添加或减去的时间天数
     * @return
     */
    public static Date getBeforeOrAfterDate(Date date, int num) {
        //获取日历
        Calendar calendar = Calendar.getInstance();
        //当date的值是当前时间，则可以不用写这段代码。
        calendar.setTime(date);
        calendar.add(Calendar.DATE, num);
        //把日历转换为Date
        return calendar.getTime();
    }

    /**
     * 根据当前时间，添加或减去指定的时间量。例如，要从当前日历时间减去 5 天，可以通过调用以下方法做到这一点：
     * add(Calendar.DAY_OF_MONTH, -5)。
     *
     * @param date 指定时间
     * @param num  为时间添加或减去的时间天数
     * @return
     */
    public static Date getDate(Date date, int field, int num) {
        //获取日历
        Calendar calendar = Calendar.getInstance();
        //当date的值是当前时间，则可以不用写这段代码。
        calendar.setTime(date);
        calendar.add(field, num);
        //把日历转换为Date
        return calendar.getTime();
    }

    public static Long uitl(Date end) {
        if (end == null) {
            return 0L;
        }
        Instant instant = end.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDate endDate = instant.atZone(zoneId).toLocalDate();
        return LocalDate.now().until(endDate, ChronoUnit.DAYS);
    }

    private static Map<Integer, String> monthMap = new HashMap<Integer, String>(0) {{
        put(1, "January");
        put(2, "February");
        put(3, "March");
        put(4, "April");
        put(5, "May");
        put(6, "June");
        put(7, "July");
        put(8, "August");
        put(9, "Sept");
        put(10, "October");
        put(11, "November");
        put(12, "December");
    }};

    public static Date getDate(Long unixTime) {
        if (Objects.isNull(unixTime)) return null;

        return new Date(unixTime);
    }
}
